/**
 * 格式化工具函数
 * 用于统一管理各种数据格式化功能
 */

/**
 * 将数字金额转换为中文大写
 * @param amount 金额数字或字符串
 * @returns 中文大写金额字符串
 */
export const convertAmountToChinese = (amount: number | string): string => {
  const num = typeof amount === 'string' ? parseFloat(amount) : amount
  if (isNaN(num) || num < 0) return '零元整'
  
  const digits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
  const units = ['', '拾', '佰', '仟']
  const bigUnits = ['', '万', '亿', '兆']
  
  // 分离整数和小数部分
  const [integerPart, decimalPart] = num.toFixed(2).split('.')
  
  // 转换整数部分
  const convertInteger = (numStr: string): string => {
    if (numStr === '0') return '零'
    
    let result = ''
    const len = numStr.length
    let zeroFlag = false
    
    for (let i = 0; i < len; i++) {
      const digit = parseInt(numStr[i])
      const pos = len - i - 1
      
      if (digit === 0) {
        if (pos % 4 === 0 && pos > 0) {
          if (result && !result.endsWith(bigUnits[Math.floor(pos / 4)])) {
            result += bigUnits[Math.floor(pos / 4)]
          }
        }
        zeroFlag = true
      } else {
        if (zeroFlag && result) {
          result += '零'
        }
        result += digits[digit]
        if (pos % 4 !== 0) {
          result += units[pos % 4]
        }
        if (pos % 4 === 0 && pos > 0) {
          result += bigUnits[Math.floor(pos / 4)]
        }
        zeroFlag = false
      }
    }
    
    return result
  }
  
  let result = convertInteger(integerPart) + '元'
  
  // 处理小数部分
  const jiao = parseInt(decimalPart[0])
  const fen = parseInt(decimalPart[1])
  
  if (jiao === 0 && fen === 0) {
    result += '整'
  } else {
    if (jiao > 0) {
      result += digits[jiao] + '角'
    } else if (fen > 0) {
      result += '零'
    }
    if (fen > 0) {
      result += digits[fen] + '分'
    }
  }
  
  return result
}

/**
 * 格式化日期为中文格式
 * @param dateString 日期字符串
 * @returns 格式化后的日期字符串 (MM/DD HH:mm)
 */
export const formatDate = (dateString: string): string => {
  if (!dateString) return ''
  const date = new Date(dateString)
  return date.toLocaleDateString('zh-CN', {
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit'
  })
}

/**
 * 格式化日期为UTC格式 - 避免时区转换
 * @param dateString 日期字符串
 * @returns 格式化后的日期字符串 (YYYY.MM.DD HH:mm)
 */
export const formatDateUTC = (dateString: string): string => {
  if (!dateString) return ''
  const date = new Date(dateString)
  // 使用UTC方法确保显示原始UTC时间，避免本地时区转换
  const year = date.getUTCFullYear()
  const month = String(date.getUTCMonth() + 1).padStart(2, '0')
  const day = String(date.getUTCDate()).padStart(2, '0')
  const hours = String(date.getUTCHours()).padStart(2, '0')
  const minutes = String(date.getUTCMinutes()).padStart(2, '0')
  
  return `${year}.${month}.${day}`
}
/**
 * 格式化日期为UTC格式 - 避免时区转换
 * @param dateString 日期字符串
 * @returns 格式化后的日期字符串 (YYYY-MM-DD HH:mm)
 */
export const formatDateUTCLine = (dateString: string): string => {
  if (!dateString) return ''
  const date = new Date(dateString)
  // 使用UTC方法确保显示原始UTC时间，避免本地时区转换
  const year = date.getUTCFullYear()
  const month = String(date.getUTCMonth() + 1).padStart(2, '0')
  const day = String(date.getUTCDate()).padStart(2, '0')
  // const hours = String(date.getUTCHours()).padStart(2, '0')
  // const minutes = String(date.getUTCMinutes()).padStart(2, '0')
  
  return `${year}-${month}-${day} `
}
/**
 * 格式化日期为完整格式
 * @param dateString 日期字符串
 * @returns 格式化后的日期字符串 (YYYY-MM-DD HH:mm:ss)
 */
export const formatFullDate = (dateString: string): string => {
  if (!dateString) return ''
  const date = new Date(dateString)
  return date.toLocaleDateString('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit'
  })
}

/**
 * 格式化日期为简短格式
 * @param dateString 日期字符串
 * @returns 格式化后的日期字符串 (MM-DD)
 */
export const formatShortDate = (dateString: string): string => {
  if (!dateString) return ''
  const date = new Date(dateString)
  return date.toLocaleDateString('zh-CN', {
    month: '2-digit',
    day: '2-digit'
  })
}

/**
 * 格式化日期为简短格式 - MM.DD HH:mm
 * 兼容多种时间格式，包括ISO 8601格式
 * @param dateString 日期字符串
 * @returns 格式化后的日期字符串 (MM.DD HH:mm)
 */
export const formatShortDateTime = (dateString: string): string => {
  if (!dateString) return ''
  
  // 创建Date对象
  const date = new Date(dateString)
  
  // 检查日期是否有效
  if (isNaN(date.getTime())) {
    console.warn('Invalid date string:', dateString)
    return ''
  }
  
  // 判断是否为ISO格式（包含T和时区信息）
  const isISOFormat = dateString.includes('T') && (dateString.includes('+') || dateString.includes('Z') || dateString.includes('-', 10))
  
  let month: string, day: string, hours: string, minutes: string
  
  if (isISOFormat) {
    // ISO格式使用UTC时间，避免时区转换
    month = String(date.getUTCMonth() + 1).padStart(2, '0')
    day = String(date.getUTCDate()).padStart(2, '0')
    hours = String(date.getUTCHours()).padStart(2, '0')
    minutes = String(date.getUTCMinutes()).padStart(2, '0')
  } else {
    // 本地格式使用本地时间
    month = String(date.getMonth() + 1).padStart(2, '0')
    day = String(date.getDate()).padStart(2, '0')
    hours = String(date.getHours()).padStart(2, '0')
    minutes = String(date.getMinutes()).padStart(2, '0')
  }
  
  return `${month}.${day} ${hours}:${minutes}`
}

/**
 * 格式化金额显示
 * @param amount 金额数字
 * @param currency 货币符号，默认为 ¥
 * @returns 格式化后的金额字符串
 */
export const formatAmount = (amount: number | string, currency: string = '¥'): string => {
  const num = typeof amount === 'string' ? parseFloat(amount) : amount
  if (isNaN(num)) return `${currency}0.00`
  
  return `${currency}${num.toFixed(2)}`
}

/**
 * 从日期时间字符串中截取日期部分
 * @param dateString 日期时间字符串
 * @returns 格式化后的日期字符串 (YYYY-MM-DD)
 */
export const formatDateOnly = (dateString: string): string => {
  if (!dateString) return ''
  
  // 创建Date对象
  const date = new Date(dateString)
  
  // 检查日期是否有效
  if (isNaN(date.getTime())) {
    console.warn('Invalid date string:', dateString)
    return ''
  }
  
  // 判断是否为ISO格式（包含T和时区信息）
  const isISOFormat = dateString.includes('T') && (dateString.includes('+') || dateString.includes('Z') || dateString.includes('-', 10))
  
  let year: number, month: string, day: string
  
  if (isISOFormat) {
    // ISO格式使用UTC时间，避免时区转换
    year = date.getUTCFullYear()
    month = String(date.getUTCMonth() + 1).padStart(2, '0')
    day = String(date.getUTCDate()).padStart(2, '0')
  } else {
    // 本地格式使用本地时间
    year = date.getFullYear()
    month = String(date.getMonth() + 1).padStart(2, '0')
    day = String(date.getDate()).padStart(2, '0')
  }
  
  return `${year}-${month}-${day}`
}

/**
 * 格式化数字，添加千分位分隔符
 * @param num 数字
 * @returns 格式化后的数字字符串
 */
export const formatNumber = (num: number | string): string => {
  const number = typeof num === 'string' ? parseFloat(num) : num
  if (isNaN(number)) return '0'
  
  return number.toLocaleString('zh-CN')
}